/**
  ******************************************************************************
  * @file    modbus_common.h
  * @author  ashuai0110
  * @version V2.4
  * @date    2024-09-10
  * @brief   modbus通用文件
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __MODBUS_COMMON_H
#define __MODBUS_COMMON_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup modbus
 * @{
 */

/**
 * @addtogroup modbus_common
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/
/**
 * @defgroup modbus_common_global_macros modbus common global macros
 * @{
 */

/**
 * @defgroup modbus_common_parameters modbus common parameters
 * @{
 */
#define MB_BUF_SIZE_MAX                 (256u)  /*!< modbus缓存区最大长度byte */
#define MB_PDU_SIZE_MIN                 (4u)    /*!< modbus PDU最小长度byte */
#define MB_RD_COIL_NUM_MAX              (2000u) /*!< modbus读线圈最大数量 */
#define MB_RD_REG_NUM_MAX               (125u)  /*!< modbus读寄存器最大数量 */
#define MB_WR_COIL_NUM_MAX              (1968u) /*!< modbus写线圈最大数量 */
#define MB_WR_REG_NUM_MAX               (123u)  /*!< modbus读寄存器最大数量 */
/**
 * @}
 */

/**
 * @defgroup modbus_common_offset modbus common offset
 * @{
 */
#define MB_ADDR_OFF                     (0u) /*!< modbus从站地址偏移 */
#define MB_CODE_OFF                     (1u) /*!< modbus功能码偏移 */
#define MB_REG_ADDR_HI_OFF              (2u) /*!< modbus寄存器地址高八位偏移 */
#define MB_REG_ADDR_LO_OFF              (3u) /*!< modbus寄存器地址低八位偏移 */
#define MB_NUM_HI_OFF                   (4u) /*!< modbus读/写数量高八位偏移 */
#define MB_NUM_LO_OFF                   (5u) /*!< modbus读/写数量低八位偏移 */

#define MB_RSP_ERR_CODE_OFF             (2u) /*!< modbus应答错误代码偏移 */
#define MB_RSP_BYTE_OFF                 (2u) /*!< modbus应答(读请求的应答)字节数偏移 */
#define MB_RSP_DATA_OFF                 (3u) /*!< modbus应答(读请求的应答)数据值偏移 */

#define MB_REQ_MULTI_DATA_OFF           (7u) /*!< modbus请求(写多个的请求)数据值偏移 */
/**
 * @}
 */

/**
 * @defgroup modbus_common_protocol modbus common protocol
 * @{
 */
#define MB_RTU                          (0u) /*!< RTU协议 */
#define MB_ASCII                        (1u) /*!< ASCII协议 */
/* 协议有效性检查 */
#define IS_VALID_MB_PROTOCOL(x)                                               \
(       ((x) == MB_RTU)                 ||                                    \
        ((x) == MB_ASCII))
/**
 * @}
 */

/**
 * @defgroup modbus_common_state modbus common state
 * @{
 */
#define MB_TX_IDLE                      (0u) /*!< 发送空闲状态-仅允许发送 */
#define MB_TX_BUSY                      (1u) /*!< 发送忙碌状态-禁止操作 */
#define MB_RX_IDLE                      (2u) /*!< 接收空闲状态-仅允许接收 */
#define MB_RX_BUSY                      (3u) /*!< 接收忙碌状态-禁止操作 */
/**
 * @}
 */

/**
 * @defgroup modbus_common_errno modbus common errno
 * @{
 */
#define MB_ERRNO_OK                     (0u) /*!< 无错误代码   - 正常 */
#define MB_ERRNO_CODE                   (1u) /*!< 错误代码0x01 - 非法功能     : 功能码无效 */
#define MB_ERRNO_ADDR                   (2u) /*!< 错误代码0x02 - 非法数据地址 : 地址无效或地址和数量的组合无效 */
#define MB_ERRNO_DATA                   (3u) /*!< 错误代码0x03 - 非法数据值   : 数据值无效或数量无效 */
#define MB_ERRNO_FAULT                  (4u) /*!< 错误代码0x04 - 从机故障     : 当从机试图执行请求的操作时,发生了不可恢复的错误 */
/**
 * @}
 */

/**
 * @}
 */

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup modbus_common_global_types modbus common global types
 * @{
 */

/**
  * @brief  modbus发送前(串口)准备函数
  *
  * @note   如:使用串口中断发送时需使能发送相关中断/使用串口DMA发送时需配置使能DMA
  *
  * @param  enState : 0-关闭(失能)  1-开启(使能)
  *
  * @retval None
  */
typedef void (* modbus_tx_en_t)(uint8_t enState);

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup modbus_common_global_functions
 * @{
 */

uint16_t mb_check_crc16(uint8_t *data, uint16_t len);
uint8_t mb_check_lrc(uint8_t *data, uint16_t len);

void mb_hex_to_ascii(uint8_t *pHex, uint16_t num, uint8_t *pAscii);
void mb_ascii_to_hex(uint8_t *pAscii, uint16_t num, uint8_t *pHex);

void mb_set_bits(uint8_t *srcBuf, uint16_t bitOffset, uint8_t bitNum, uint8_t bitVal);
uint8_t mb_get_bits(uint8_t *srcBuf, uint16_t bitOffset, uint8_t bitNum);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* modbus_common.h */
